/**
 * 
 */
package org.stars.daostars.core.parser;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.stars.daostars.core.SqlQuery;
import org.stars.daostars.sqlmapper.SqlMapper;

/**
 * Data una query con i parametri, rimuove tutti gli spazi presenti tra le parentesi quadre.
 * 
 * Ad esempio:
 * 
 * <pre>
 * &[asdf sdfsdf]
 * </pre>
 * Diventa
 * <pre>
 * &[asdfsdfsdf]
 * </pre>
 * 
 * Questa classe è stata fatta in quanto gli spazi con i parametri davano problemi.
 * 
 * @author Francesco Benincasa (908099)
 * 
 */
public abstract class FindWhiteSpaceInParameters {

	/**
	 * Matcher compilato.
	 */
	private static Pattern pattern = Pattern.compile(getRegExMatcher(), Pattern.MULTILINE);
		
	/**
	 * Pattern effettuato per la ricerca
	 * 
	 * @return
	 * 		pattern
	 */
	public static String getRegExMatcher() {
		return regParameter+"|"+ regVariable+"|"+regArray;
	}

	/**
	 * considera i nomi compresi gli spazi
	 */
	public final static String regNome = "[\\w\\.\\-_\\s]+";

	public final static String regParameter = 	"((\\&)\\[\\s*(\\s*(" + regNome	+ ")\\s*)(\\((\\s*(" + regNome + ")\\s*)\\))?\\s*\\])";

	public final static String regVariable = 	"((\\#)\\[\\s*(\\s*(" + regNome	+ ")\\s*)(\\((\\s*(" + regNome + ")\\s*)\\))?\\s*\\])";

	public final static String regArray =		"((\\@)\\[\\s*(\\s*(" + regNome	+ ")\\s*)(\\((\\s*(" + regNome + ")\\s*)\\))?\\s*\\])";


	/**
	 * Data una definizione di dao, rimuove da tutte le query in essa contenuta
	 * gli spazi inutili.
	 * 
	 * @param definition
	 *            definizione del dao
	 * @return <code>true</code> se tutto va bene
	 * @throws Exception
	 *             in caso di errore
	 */
	public static boolean execute(SqlMapper definition) throws Exception {
		for (SqlQuery sqlQuery : definition.getQuerySet().values()) {
			String sql = sqlQuery.getPlainSql();
			String newSql= execute(sql);
			sqlQuery.setPlainSql(newSql);
		}

		return true;
	}

	/**
	 * Data una stringa in input, rimuove tutti i doppi spazi
	 * 
	 * @param input
	 *            stringa in input
	 * @return stringa in ouput senza spazi ripetuti
	 */
	public static String execute(String input) {
		// dobbiamo per sicurezza rimuovere i caratteri prima e dopo
		input = input.trim();
		Matcher matcher = pattern.matcher(input);
		StringBuffer sb = new StringBuffer();
		String tmp;
		
		while (matcher.find()) {			
			tmp=FindWhiteSpace.execute(matcher.group(0),"").trim();							
			matcher.appendReplacement(sb, tmp);
		}

		matcher.appendTail(sb);

		return sb.toString();
	}
}
